#Copyright (c) 2008-2009 Peter H. Boling of 9thBit LLC
#Released under the MIT license

module ExceptionNotification::HelpfulHashes
  SILENT_EXCEPTIONS = begin
    noiseless = []
    noiseless << ActiveRecord::RecordNotFound if defined?(ActiveRecord)
    if defined?(ActionController)
      noiseless << ActionController::UnknownController
      noiseless << ActionController::UnknownAction
      noiseless << ActionController::RoutingError
      noiseless << ActionController::MethodNotAllowed
    end
    noiseless
  end

  # TODO: use ActionController::StatusCodes
  HTTP_STATUS_CODES = {
    "400" => "Bad Request",
    "403" => "Forbidden",
    "404" => "Not Found",
    "405" => "Method Not Allowed",
    "410" => "Gone",
    "418" => "I'm a teapot",
    "422" => "Unprocessable Entity",
    "423" => "Locked",
    "500" => "Internal Server Error",
    "501" => "Not Implemented",
    "503" => "Service Unavailable"
  }

  def codes_for_error_classes
    #TODO: Format whitespace
    classes = {
      # These are standard errors in rails / ruby
      NameError => "503",
      TypeError => "503",
      RuntimeError => "500",
      ArgumentError => "500",
      # These are custom error names defined in lib/super_exception_notifier/custom_exception_classes
      AccessDenied => "403",
      PageNotFound => "404",
      InvalidMethod => "405",
      ResourceGone => "410",
      CorruptData => "422",
      NoMethodError => "500",
      NotImplemented => "501",
      MethodDisabled => "200"
    }
    # Highly dependent on the verison of rails, so we're very protective about these'
    classes.merge!({ ActionView::TemplateError => "500"})             if defined?(ActionView)       && ActionView.const_defined?(:TemplateError)
    classes.merge!({ ActiveRecord::RecordNotFound => "400" })         if defined?(ActiveRecord)     && ActiveRecord.const_defined?(:RecordNotFound)
    classes.merge!({ ActiveResource::ResourceNotFound => "404" })     if defined?(ActiveResource)   && ActiveResource.const_defined?(:ResourceNotFound)

    if defined?(ActionController)
      classes.merge!({ ActionController::UnknownController => "404" })          if ActionController.const_defined?(:UnknownController)
      classes.merge!({ ActionController::MissingTemplate => "404" })            if ActionController.const_defined?(:MissingTemplate)
      classes.merge!({ ActionController::MethodNotAllowed => "405" })           if ActionController.const_defined?(:MethodNotAllowed)
      classes.merge!({ ActionController::UnknownAction => "501" })              if ActionController.const_defined?(:UnknownAction)
      classes.merge!({ ActionController::RoutingError => "404" })               if ActionController.const_defined?(:RoutingError)
      classes.merge!({ ActionController::InvalidAuthenticityToken => "405" })   if ActionController.const_defined?(:InvalidAuthenticityToken)
    end
  end
end
